/*
*  Copyright (c) 2001 Sun Microsystems, Inc.  All rights
*  reserved.
*
*  Redistribution and use in source and binary forms, with or without
*  modification, are permitted provided that the following conditions
*  are met:
*
*  1. Redistributions of source code must retain the above copyright
*  notice, this list of conditions and the following disclaimer.
*
*  2. Redistributions in binary form must reproduce the above copyright
*  notice, this list of conditions and the following discalimer in
*  the documentation and/or other materials provided with the
*  distribution.
*
*  3. The end-user documentation included with the redistribution,
*  if any, must include the following acknowledgment:
*  "This product includes software developed by the
*  Sun Microsystems, Inc. for Project JXTA."
*  Alternately, this acknowledgment may appear in the software itself,
*  if and wherever such third-party acknowledgments normally appear.
*
*  4. The names "Sun", "Sun Microsystems, Inc.", "JXTA" and "Project JXTA"
*  must not be used to endorse or promote products derived from this
*  software without prior written permission. For written
*  permission, please contact Project JXTA at http://www.jxta.org.
*
*  5. Products derived from this software may not be called "JXTA",
*  nor may "JXTA" appear in their name, without prior written
*  permission of Sun.
*
*  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
*  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
*  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
*  DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
*  ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
*  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
*  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
*  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
*  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
*  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
*  OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
*  SUCH DAMAGE.
*  ====================================================================
*
*  This software consists of voluntary contributions made by many
*  individuals on behalf of Project JXTA.  For more
*  information on Project JXTA, please see
*  <http://www.jxta.org/>.
*
*  This license is based on the BSD license adopted by the Apache Foundation.
*
*  $Id: AbstractCommand.java,v 1.11 2007/01/26 21:54:25 bondolo Exp $
*/

package net.jxta.myjxta.dialog.commands;

import net.jxta.logging.Logging;
import net.jxta.myjxta.dialog.Command;

import java.text.MessageFormat;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * The The base Dialog for Group Chats.
 * ge
 * @version $Id: AbstractCommand.java,v 1.11 2007/01/26 21:54:25 bondolo Exp $
 *
 * @author james todd [gonzo at jxta dot org]
 */

public abstract class AbstractCommand
implements Command {
   
    protected static final String NEW_LINE = "\n";
    protected static final String TAB = "  ";
    protected static final MessageFormat TEMPLATE_REQUEST = new MessageFormat(
"<request id=\"{0}\"/>");
    protected static final MessageFormat TEMPLATE_RESPONSE = new MessageFormat(
"<response status=\"{0}\">" + NEW_LINE +
TAB + "{1}" + NEW_LINE +
TAB + "{2}" + NEW_LINE +
"</response>");
    
    private static final Logger LOG = Logger.getLogger(AbstractCommand.class.getName());
        
    private String command = null;
    private String reply = null;
    private boolean status = false;
    
    public String getRequest() {
	Object[] args = { getId() };
        String request = TEMPLATE_REQUEST.format(args);
        
        if (Logging.SHOW_FINE && LOG.isLoggable(Level.FINE)) {
            LOG.fine("request: " + request);
        }
        
        return request;
    }
    
    public String getResponse() {
	Object[] args = {getStatus(), getCommand(), getReply() };
        String response = TEMPLATE_RESPONSE.format(args);
        
        if (Logging.SHOW_FINE&& LOG.isLoggable(Level.FINE)) {
            LOG.fine("response: " + response);
        }
        
        return response;
    }
    
    public String toString() {
        String s = getRequest();
        
        if (Logging.SHOW_INFO && LOG.isLoggable(Level.INFO)) {
            LOG.info("toString: " + s);
        }
        
        return s;
    }
    
    protected String getCommand() {
        String c = this.command;
        
        if (Logging.SHOW_FINE && LOG.isLoggable(Level.FINE)) {
            LOG.fine("command " + c);
        }
        
        return c;
    }
    
    protected void setCommand(String command) {
        if (Logging.SHOW_FINE && LOG.isLoggable(Level.FINE)) {
            LOG.fine("set command: " + command);
        }
        
        this.command = command;
    }
    
    protected String getReply() {
        String result = this.reply;
        
        if (Logging.SHOW_FINE && LOG.isLoggable(Level.FINE)) {
            LOG.fine("reply: " + result);
        }
                
        return result;
    }
    
    protected void setReply(String reply) {
        if (Logging.SHOW_FINE && LOG.isLoggable(Level.FINE)) {
            LOG.fine("set reply: " + reply);
        }
                
        this.reply = reply;
    }
    
    protected boolean getStatus() {
        boolean s = this.status;
        
        if (Logging.SHOW_INFO && LOG.isLoggable(Level.INFO)) {
            LOG.info("status: " + s);
        }
        
        return s;
    }
    
    protected void setStatus(boolean status) {
        if (Logging.SHOW_INFO && LOG.isLoggable(Level.INFO)) {
            LOG.info("set status: " + status);
        }
        
        this.status = status;
    }
}
